﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CRM_WF.GestionEleveservice;
using CRM_WF.GestionAgenceService;
using CRM_WF.GestionCentreFormationService;
using CRM_WF.GestionCircuitService;
using CRM_WF.GestionEmployeService;
using CRM_WF.GestionFormateurService;
using CRM_WF.GestionFormationService;
using CRM_WF.GestionNotesService;
using CRM_WF.GestionPermisService;
using CRM_WF.GestionSessionConduiteService;
using CRM_WF.GestionSessionFormationService;
using CRM_WF.GestionThemeService;
using CRM_WF.GestionTypeSessionService;
using CRM_WF.GestionVehiculeService;
using System.ServiceModel;


namespace CRM_WF
{
    class WebServices
    {
        GestionEleveServiceClient gestionEleve;
        GestionAgenceServiceClient gestionAgence;
        GestionCentreFormationServiceClient  gestionCentreFormation;
        GestionCircuitServiceClient gestionCircuit;
        GestionEmployeServiceClient gestionEmploye;
        GestionFormateurServiceClient gestionFormateur;
        GestionFormationServiceClient gestionFormation;
        GestionNotesServiceClient gestionNote;
        GestionPermisServiceClient gestionPermis;
        GestionSessionConduiteServiceClient gestionSessionConduite;
        GestionSessionFormationServiceClient gestionSessionFormation;
        GestionThemeServiceClient gestionTheme;
        GestionTypeSessionServiceClient gestionTypeSession;
        GestionVehiculeServiceClient gestionVehicule;
        
        public WebServices()
        {
            try
            {
                gestionEleve = new GestionEleveServiceClient("WSHttpBinding_IGestionEleveService");
                gestionAgence = new GestionAgenceServiceClient("WSHttpBinding_IGestionAgenceService");
                gestionCentreFormation = new GestionCentreFormationServiceClient("WSHttpBinding_IGestionCentreFormationService");
                gestionCircuit = new GestionCircuitServiceClient("WSHttpBinding_IGestionCircuitService");
                gestionEmploye = new GestionEmployeServiceClient("WSHttpBinding_IGestionEmployeService");
                gestionFormateur = new GestionFormateurServiceClient("WSHttpBinding_IGestionFormateurService");
                gestionFormation = new GestionFormationServiceClient("WSHttpBinding_IGestionFormationService");
                gestionNote = new GestionNotesServiceClient("WSHttpBinding_IGestionNotesService");
                gestionPermis = new GestionPermisServiceClient("WSHttpBinding_IGestionPermisService");
                gestionSessionConduite = new GestionSessionConduiteServiceClient("WSHttpBinding_IGestionSessionConduiteService");
                gestionSessionFormation = new GestionSessionFormationServiceClient("WSHttpBinding_IGestionSessionFormationService");
                gestionTheme = new GestionThemeServiceClient("WSHttpBinding_IGestionThemeService");
                gestionTypeSession = new GestionTypeSessionServiceClient("WSHttpBinding_IGestionTypeSessionService");
                gestionVehicule = new GestionVehiculeServiceClient("WSHttpBinding_IGestionVehiculeService");
            }
            catch(Exception e)
            {
                throw new Exception("Erreur création web service. Vérifiez que les services ASP.net soit lancé. " + e.Message);
            }
        }

        public List<string> RecupererToutLesEleves()
        {
            List<string> retourListEleves = new List<string>();
            foreach (Eleve eleve in gestionEleve.GetAllEleves())
            {
                retourListEleves.Add(eleve.Nom + " " + eleve.Prenom);
            }
            return retourListEleves;
        }

        public List<string> RecupererToutLesVehicules()
        {
            List<string> retourListVehicule = new List<string>();
            foreach (Vehicule vehicule in gestionVehicule.GetAllVehicules())
            {
                retourListVehicule.Add(vehicule.Type + " " + vehicule.Marque +" "
                    +vehicule.Modele +" "+vehicule.Immatriculation +" "+ vehicule.Annee);
            }
            return retourListVehicule;
        }

        public List<string> RecupererToutLesFormateurs()
        {
            List<string> retourListFormateurs = new List<string>();
            foreach (Formateur formateur in gestionFormateur.GetAllFormateurs ())
            {
                retourListFormateurs.Add(formateur.ID + " " +formateur.Nom + " "+formateur.Prenom + " "+ formateur.Adresse + " "+formateur.CodePostal + " "+formateur.Ville + " "+formateur.Email + " "+formateur.Telephone);
            }
            return retourListFormateurs;
        }

        public List<string> ListeEleveDeLaJournee(string date)
        {
            string[] split = date.Split(" / :".ToCharArray());
            DateTime dateuh = new DateTime (Int32.Parse(DateTime.Parse(split[2]).Year.ToString()), Int32.Parse(DateTime.Parse(split[1]).Month.ToString()), Int32.Parse(DateTime.Parse(split[0]).Day.ToString()), 0, 0, 0);
            List<string> retourListEleves = new List<string>();
            List<SessionConduite> po = gestionSessionConduite.GetSessionConduiteByDay(dateuh);
            foreach (SessionConduite sessionDeConduite in po)
            {
                Eleve eleve = gestionEleve.GetEleveById(sessionDeConduite.EleveID); // A MODIF !
               retourListEleves.Add(eleve.Nom + " " + eleve.Prenom);
            }
            return retourListEleves;
        }

        public List<string> recupererTypesPermis()
        {

            List<string> listePermis = new List<string>();
            foreach (Permis permis in gestionPermis.GetAllPermis())
            {
                listePermis.Add(permis.Description);
            }
            return listePermis;
        }
         
        public List<string> bob()
        {
            string toto = "";
            if (toto.GetType() == typeof(string))
            {
                return new List<string>();
            }
             return new List<string>();
        }

        public void NoterEleve(int note, int eleveID,int sessionID)
        {
           
            Notes addNote = new Notes()
            {
                Note=note ,
                EleveID = eleveID,

            };
            gestionNote.CreateNote(addNote);
        }

        public List<string> RecupererListeFormationsFormateur()
        {
            List<string> Retourformation = new List<string>();
            foreach (SessionFormation session in gestionSessionFormation.GetAllSessionFormations ())
            {
                Retourformation.Add(session.TypeSessionID + " "+session.DateDebut +" "+ gestionFormateur.GetFormateurById (session.FormateurID).Nom  +" "+ gestionFormateur.GetFormateurById (session.FormateurID).Prenom +" "+session.DateFin + ", Formateur"
                );
            }

            return Retourformation;
        }

        public List<string> RecupererToutesLesSessionsFormationParDate(DateTime date)
        {
            List<string> listSession = new List<string>();
            listSession .Add("ID       Nombre d'heures       Date debut      Date Fin     Nom Formateur   Prenom Formateur   Nom Eleve  Prenom Eleve    ");
            foreach (SessionFormation session in gestionSessionFormation.GetAllSessionFormations())  // a modif pour avoir la recherche par date
            {
                listSession.Add(session.ID + "     " +session.NombreDHeures + "     " + session.DateDebut + "     " +
                    session.DateFin+ "     "+gestionFormateur.GetFormateurById(session.FormateurID).Nom + " " + 
                    gestionFormateur.GetFormateurById(session.FormateurID).Prenom +"     "+
                    gestionEleve.GetEleveById(session.EleveID).Nom +" "+gestionEleve.GetEleveById(session.EleveID).Prenom );
                    //+ gestionTypeSession.GetTypeSessionById(session.TypeSessionID).(gesttion
            }

            return listSession ;
        }

        public List<string> RecupererToutesLesSessionsConduiteParDate(DateTime date)
        {
            List<string> listConduite = new List<string>();
            listConduite.Add("ID       Nombre d'heures       Date debut      Date Fin     Nom Formateur   Prenom Formateur   Nom Eleve  Prenom Eleve    ");
            foreach (SessionConduite session in gestionSessionConduite.GetAllSessionConduites())  // a modif pour avoir la recherche par date
            {
                listConduite.Add(session.ID + "     " + session.NombreDHeures + "     " + session.DateDebut + "     " +
                    session.DateFin + "     " + gestionFormateur.GetFormateurById(session.FormateurID).Nom + " " +
                    gestionFormateur.GetFormateurById(session.FormateurID).Prenom + "     " +
                    gestionEleve.GetEleveById(session.EleveID).Nom + " " + gestionEleve.GetEleveById(session.EleveID).Prenom);
                //+ gestionTypeSession.GetTypeSessionById(session.TypeSessionID).(gesttion
            }

            return listConduite;
        }

        public List<string> RecupererToutesLesSessionsConduite()
        {
            List<string> listConduite = new List<string>();
            foreach (SessionConduite session in gestionSessionConduite.GetAllSessionConduites())  
            {
                listConduite.Add(session.ID + "     " + session.NombreDHeures + "     " + session.DateDebut + "     " +
                    session.DateFin + "     " + gestionFormateur.GetFormateurById(session.FormateurID).Nom + " " +
                    gestionFormateur.GetFormateurById(session.FormateurID).Prenom + "     " +
                    gestionEleve.GetEleveById(session.EleveID).Nom + " " + gestionEleve.GetEleveById(session.EleveID).Prenom);
                //+ gestionTypeSession.GetTypeSessionById(session.TypeSessionID).(gesttion
            }

            return listConduite;
        }
        public List<string> RecupererToutesLesSessionsFormation()
        {
            List<string> listConduite = new List<string>();
            foreach (SessionFormation session in gestionSessionFormation.GetAllSessionFormations())  
            {
                listConduite.Add(session.ID + "     " + session.NombreDHeures + "     " + session.DateDebut + "     " +
                    session.DateFin + "     " + gestionFormateur.GetFormateurById(session.FormateurID).Nom + " " +
                    gestionFormateur.GetFormateurById(session.FormateurID).Prenom + "     " +
                    gestionEleve.GetEleveById(session.EleveID).Nom + " " + gestionEleve.GetEleveById(session.EleveID).Prenom);
                //+ gestionTypeSession.GetTypeSessionById(session.TypeSessionID).(gesttion
            }

            return listConduite;
        }

        public SessionFormation RecupererToutesLesSessionFormationParId(int sessionId)
        {
            return gestionSessionFormation.GetSessionFormationById(sessionId);
        }


       /* public List<string> RecupererToutesLesSessionsFormationByEleveId(int id)
        {
            List<string> retourListSessions = new List<string>();
            foreach (SessionFormation session in gestionSessionFormation.GetSessionFormationByEleveId(id))
            {
                retourListSessions.Add("ID : " + session.ID + " Date de Début : " + session.DateDebut + " Date de Fin " + session.DateFin);
            }
            return retourListSessions;
        }*/

        public List<SessionFormation> RecupererToutesLesSessionsFormationByEleveId(int eleveId)
        {
            return gestionSessionFormation.GetSessionFormationByEleveId(eleveId);    
        }

        public void AjouterEleve(string nom, string prenom, string login, string password, string adresse, string ville, int codePostal, string mail, int telephone, int formateurID, bool titulaireCode)
        {
            Eleve eleve = new Eleve
            {
                Nom = nom,
                Prenom = prenom,
                Login = login,
                MotDePasse = password,
                Adresse = adresse,
                Ville = ville,
                CodePostal = codePostal,
                Email = mail,
                Telephone = telephone,
                FormateurID = formateurID,
                TitulaireCode = titulaireCode
            };

            gestionEleve.CreateEleve(eleve);
        }

        public void AjouterNote(DateTime date, int note, int eleveId, int formateurID)
        {
            Notes noteEleve = new Notes
            {
                Date = date, 
                Note = note, 
                EleveID = eleveId, 
                FormateurID = formateurID
            };

            gestionNote.CreateNote(noteEleve);
        }

        public void UpdaterEleve(Eleve eleve)
        {
            gestionEleve.UpdateEleve(eleve);
        }

        public void UpdaterNote(Notes note)
        {
            gestionNote.UpdateNote(note);
        }

        public int VerifierUser(string login, string password)
        {
            Formateur formateur = new Formateur();
            Employe employe = new Employe();
            try
            {
                if (gestionFormateur.authentificateFormateur(login, password))
                {
                    formateur = gestionFormateur.GetFormateurByLogin(login);
                }
                else if(gestionEmploye.authentificateEleve(login,password))
                {
                 employe = gestionEmploye.GetEmployeByLogin(login);
                }
            }
            catch
            {
            }

            if (!String.IsNullOrEmpty(formateur.Nom))
            {
                if (formateur.MotDePasse == password) return 1;
                else return 0;
            }

            else if (!String.IsNullOrEmpty(employe.Nom))
            {
                if (employe.MotDePasse == password)
                    if (employe.Poste == "Administration") return 2;
                    else return 3;

                else return 0;
            }

            else if (login == "admin" && password == "admin")
            {
                return 4;
            }
            
            return 0;
        }

        public Formateur RecupererFormateurParId(int id)
        {
            Formateur formateur = new Formateur();
            formateur = gestionFormateur.GetFormateurById(id);
            return formateur;
        }

        public Eleve RecupererEleveParId(int id)
        {
            Eleve eleve = new Eleve();
            eleve = gestionEleve.GetEleveById(id);
            return eleve;
        }

        /*public Notes RecupererNoteParEleveIdEtDay(int eleveId, DateTime date)
        {
            Notes note = new Notes();
            note = gestionNote.ReadNoteByEleveIdAndDay(eleveId, date);
            return note;
        }*/

        public List<string> RecupererNoteParEleveIdEtDay(int eleveId, DateTime date)
        {
            
            List<Notes> Listenote = gestionNote.ReadNoteByEleveIdAndDay(eleveId, date);
            List<string> retourNote = new List<string>();

            if (Listenote.Count != 0)
            {
              //retourNote.Add(Listenote[0].EleveID.ToString());
                retourNote.Add(Listenote[0].Note.ToString());
                retourNote.Add(Listenote[0].ID.ToString());
                //retourNote.Add(Listenote[0].Note.ToString());
                
            }

            return retourNote;
        }

        public Notes RecupererNoteParId(int noteId)
        {

            return gestionNote.GetNoteById(noteId);
        }

        public List<string> RecupererEleveParPrenomEtNom(string prenom, string nom)
        {
            List<Eleve> ListeEleve = gestionEleve.GetEleveByPrenomEtNom(prenom, nom);

            List<string> RetourEleve = new List<string>();

            RetourEleve.Add(ListeEleve[0].Nom);
            RetourEleve.Add(ListeEleve[0].Prenom);
            RetourEleve.Add(ListeEleve[0].Adresse);
            RetourEleve.Add(ListeEleve[0].CodePostal.ToString());
            RetourEleve.Add(ListeEleve[0].Ville);
            RetourEleve.Add(ListeEleve[0].Email);
            RetourEleve.Add(ListeEleve[0].Telephone.ToString());
            RetourEleve.Add(ListeEleve[0].TitulaireCode.ToString());
            RetourEleve.Add(ListeEleve[0].FormateurID.ToString());
            RetourEleve.Add(ListeEleve[0].Login);
            RetourEleve.Add(ListeEleve[0].MotDePasse);
            RetourEleve.Add(ListeEleve[0].ID.ToString());

            return RetourEleve;

        }

        public List<string> RecupererEleveParPrenom(string prenom)
        {
            List<Eleve> ListeEleve = gestionEleve.GetEleveByPrenom(prenom);

            List<string> RetourEleve = new List<string>();

            try
            {
                RetourEleve.Add(ListeEleve[0].Nom);
                RetourEleve.Add(ListeEleve[0].Prenom);
                RetourEleve.Add(ListeEleve[0].Adresse);
                RetourEleve.Add(ListeEleve[0].CodePostal.ToString());
                RetourEleve.Add(ListeEleve[0].Ville);
                RetourEleve.Add(ListeEleve[0].Email);
                RetourEleve.Add(ListeEleve[0].Telephone.ToString());
                RetourEleve.Add(ListeEleve[0].TitulaireCode.ToString());
                RetourEleve.Add(ListeEleve[0].FormateurID.ToString());
                RetourEleve.Add(ListeEleve[0].Login);
                RetourEleve.Add(ListeEleve[0].MotDePasse);
                RetourEleve.Add(ListeEleve[0].ID.ToString());


                return RetourEleve;
            }

            catch (Exception e)
            {
                throw new Exception("retour vide" + e.Message);
            }

        }

        public List<string> RecupererEleveParNom(string nom)
        {
            List<Eleve> ListeEleve = gestionEleve.GetEleveByNom(nom);

            List<string> RetourEleve = new List<string>();

            try
            {
                RetourEleve.Add(ListeEleve[0].Nom);
                RetourEleve.Add(ListeEleve[0].Prenom);
                RetourEleve.Add(ListeEleve[0].Adresse);
                RetourEleve.Add(ListeEleve[0].CodePostal.ToString());
                RetourEleve.Add(ListeEleve[0].Ville);
                RetourEleve.Add(ListeEleve[0].Email);
                RetourEleve.Add(ListeEleve[0].Telephone.ToString());
                RetourEleve.Add(ListeEleve[0].TitulaireCode.ToString());
                RetourEleve.Add(ListeEleve[0].FormateurID.ToString());
                RetourEleve.Add(ListeEleve[0].Login);
                RetourEleve.Add(ListeEleve[0].MotDePasse);
                RetourEleve.Add(ListeEleve[0].ID.ToString());

                return RetourEleve;
            }

            catch (Exception e)
            {
                throw new Exception("retour vide" + e.Message);
            }

        }

        public void AjouterSession(string dateDebut,string datefin,string Nombredheure,string typeSessionID,string FormateurId,string EleveID,string vehiculeId,string type)
        {string[] split = FormateurId.Split(' ');
        string[] split2 = EleveID.Split(' ');
            switch(type)
            {
                case "Formation":
                    SessionFormation sessionfo = new SessionFormation();
                    
                    
                        sessionfo.DateDebut = DateTime.Parse(dateDebut);
                        sessionfo.DateFin=DateTime.Parse(datefin);
                        sessionfo.NombreDHeures=Int32.Parse ( Nombredheure);
                        sessionfo.TypeSessionID =0 ;
                        sessionfo.FormateurID= gestionFormateur.GetFormateurByPrenomEtNom(split[1],split[0])[0].ID ;
                        sessionfo.EleveID = gestionEleve.GetEleveByPrenomEtNom(split2[1], split2[0])[0].ID;
                    
                    
                    gestionSessionFormation.CreateSessionFormation(sessionfo);
                    break;
                    
                case "Conduite":
                    SessionConduite sessionconduite = new SessionConduite();
                    
                        sessionconduite.DateDebut = DateTime.Parse(dateDebut);
                        sessionconduite.DateFin=DateTime.Parse(datefin);
                        sessionconduite.NombreDHeures=Int32.Parse ( Nombredheure);
                        sessionconduite.TypeSessionID = Int32.Parse( typeSessionID );
                        sessionconduite.FormateurID = gestionFormateur.GetFormateurByPrenomEtNom(split[1], split[0])[0].ID;
                       sessionconduite.EleveID = Int32.Parse(EleveID);
                    

                    gestionSessionConduite.CreateSessionConduite(sessionconduite);
                    break;
            }
        }

        public void ModifierSession(string dateDebut, string datefin, string Nombredheure, string typeSessionID, string FormateurId, string EleveID, string vehiculeId, string type)
        {
            string[] split = FormateurId.Split(' ');
            string[] split2 = EleveID.Split(' ');
            switch (type)
            {
                case "Formation":
                    SessionFormation sessionfo = new SessionFormation();


                    sessionfo.DateDebut = DateTime.Parse(dateDebut);
                    sessionfo.DateFin = DateTime.Parse(datefin);
                    sessionfo.NombreDHeures = Int32.Parse(Nombredheure);
                    sessionfo.TypeSessionID = 0;
                    sessionfo.FormateurID = gestionFormateur.GetFormateurByPrenomEtNom(split[1], split[0])[0].ID;
                    sessionfo.EleveID = gestionEleve.GetEleveByPrenomEtNom(split2[1], split2[0])[0].ID;


                    gestionSessionFormation.UpdateSessionFormation(sessionfo);
                    break;

                case "Conduite":
                    SessionConduite sessionconduite = new SessionConduite();

                    sessionconduite.DateDebut = DateTime.Parse(dateDebut);
                    sessionconduite.DateFin = DateTime.Parse(datefin);
                    sessionconduite.NombreDHeures = Int32.Parse(Nombredheure);
                    sessionconduite.TypeSessionID = Int32.Parse(typeSessionID);
                    sessionconduite.FormateurID = gestionFormateur.GetFormateurByPrenomEtNom(split[1], split[0])[0].ID;
                    sessionconduite.EleveID = Int32.Parse(EleveID);


                    gestionSessionConduite.UpdateSessionConduite(sessionconduite);
                    break;
            }
        }
        
        public List<string> RecupererSessionConduiteParId(int id)
        {
            List<string> retourSession = new List<string>();
            SessionConduite session = gestionSessionConduite.GetSessionConduiteById(id);

            retourSession.Add(session.ID.ToString());
            retourSession.Add(" ");
            retourSession.Add(session.DateDebut.ToShortDateString());
            retourSession.Add(" ");
            retourSession.Add(session.DateFin.ToShortDateString());
            retourSession.Add(" ");
            retourSession.Add(session.TypeSessionID.ToString());
            retourSession.Add(" ");
            retourSession.Add(session.FormateurID.ToString());
            retourSession.Add(" ");
            retourSession.Add(session.NombreDHeures.ToString());
            retourSession.Add(" ");
            retourSession.Add(session.VehiculeID.ToString());
            retourSession.Add(" ");
            retourSession.Add(session.EleveID.ToString());
            retourSession.Add(" ");
            retourSession.Add(session.DateDebut.ToShortTimeString());
            retourSession.Add(" ");
            retourSession.Add(session.DateFin.ToShortTimeString());
         
            return retourSession;
        }

        public void ModifierFormateur(string id,string nom, string prenom,string adresse,string codePostal, string ville, string email,string telephone)
        {

            Formateur formateur = new Formateur()
                {
                ID = Int32.Parse(id),
                Nom=nom,
                Prenom =prenom,
                Adresse=adresse,
                CodePostal=Int32.Parse(codePostal),
                Ville=ville,
                Email=email,
                Telephone=Int32.Parse(telephone) ,
                Login = nom+prenom,
                MotDePasse=prenom+nom,
                AgenceID= 1
                };
            gestionFormateur.UpdateFormateur(formateur);
        }

    }
}
